`timescale 1ns/1ns
`define clk_period 20

module button_tb;

reg clk;
reg rst_n;
reg key;

wire key_p_flag;
wire key_r_flag;

button button_instance(
	.clk(clk) 			,
	.rst_n(rst_n)		,
	.key(key)			,
	.key_p_flag(key_p_flag)	,	// 检测按下标志	
	.key_r_flag(key_r_flag)
);

defparam button_instance.MCNT = 100;

initial clk = 0;
always #(`clk_period/2) clk = ~clk;

initial begin
	key = 1'b1;
	
	// reset
	rst_n = 1'b1;
	#(`clk_period*2)
	rst_n = 1'b0;
	#(`clk_period*2)
	rst_n = 1'b1;
	// 模拟一个按下到释放的过程
	// 1. 未按下状态
	key = 1'b1;
	#(`clk_period*10);
	
	// 2. 按下抖动
	key = 1'b0;
	#(`clk_period*20);
	key = 1'b1;
	#(`clk_period*10);
	key = 1'b0;
	#(`clk_period*10);
	key = 1'b1;
	#(`clk_period*10);
	key = 1'b0;
	#3000; // 3. 30毫秒的按下状态
	
	// 4. 释放抖动
	key = 1'b1;
	#(`clk_period*10);
	key = 1'b0;
	#(`clk_period*10);
	key = 1'b1;
	#(`clk_period*20);
	key = 1'b0;
	#(`clk_period*10);
	key = 1'b1;
	#3000; // 3. 30毫秒的释放状态
	$stop;
end


endmodule
